package com.learn.service.impl;

import com.learn.service.AiChatService;
import dev.langchain4j.data.message.AiMessage;
import dev.langchain4j.data.message.ChatMessage;
import dev.langchain4j.model.chat.ChatLanguageModel;
import dev.langchain4j.model.chat.StreamingChatLanguageModel;
import dev.langchain4j.model.StreamingResponseHandler;
import dev.langchain4j.model.output.Response;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import reactor.core.publisher.Flux;

import java.util.List;
import java.util.Map;

@Service
public class AiChatServiceImpl implements AiChatService {

    @Autowired
    private ChatLanguageModel chatLanguageModel;

    @Autowired
    private StreamingChatLanguageModel streamingChatLanguageModel;

    @Override
    public String aiSimpleChat(String question) {
        String prompt = "请使用Markdown格式回答以下问题。在回答中适当使用标题（使用1-6级标题组织内容结构）、列表（有序和无序）、代码块（使用合适的编程语言标识符，如java、python、javascript等）、粗体、斜体等Markdown元素来组织内容，使回答结构清晰、易于阅读。特别注意：代码块必须使用具体的编程语言标识符，不要使用generic、伪代码或空标识符。\n\n问题: " + question;
        return this.chatLanguageModel.generate(prompt);
    }

    @Override
    public Flux<String> streamChat(String question) {
        String  prompt = "请使用Markdown格式回答以下问题。在回答中适当使用标题（使用1-6级标题组织内容结构）、列表（有序和无序）、代码块（使用合适的编程语言标识符，如java、python、javascript等）、粗体、斜体等Markdown元素来组织内容，使回答结构清晰、易于阅读。特别注意：代码块必须使用具体的编程语言标识符，不要使用generic、伪代码或空标识符。\n\n问题: " + question;
        
        return Flux.create(sink -> {
            streamingChatLanguageModel.generate(
                prompt, new StreamingResponseHandler<AiMessage>() {

                        @Override
                        public void onNext(String s) {
                            sink.next(s);
                        }

                        @Override
                    public void onComplete(Response<AiMessage> response) {
                        sink.complete();
                    }

                    @Override
                    public void onError(Throwable throwable) {
                        sink.error(throwable);
                    }
                }
            );
        });
    }

    @Override
    public String chat(List<Map<String, String>> messages) {
        return "";
    }

    @Override
    public Flux<String> streamChat(List<Map<String, String>> messages) {
        return null;
    }

    @Override
    public List<ChatMessage> getConversationHistory(String conversationId) {
        return List.of();
    }

    @Override
    public void clearConversationHistory(String conversationId) {

    }
}